home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / m6502 / m6502.h < prev    next >
C/C++ Source or Header  |  2000-05-18  |  14KB  |  413 lines

  1. /*****************************************************************************
  2.  *
  3.  *     m6502.h
  4.  *     Portable 6502/65c02/65sc02/6510/n2a03 emulator interface
  5.  *
  6.  *     Copyright (c) 1998,1999,2000 Juergen Buchmueller, all rights reserved.
  7.  *     65sc02 core Copyright (c) 2000 Peter Trauner.
  8.  *
  9.  *     - This source code is released as freeware for non-commercial purposes.
  10.  *     - You are free to use and redistribute this code in modified or
  11.  *       unmodified form, provided you list me in the credits.
  12.  *     - If you modify this source code, you must add a notice to each modified
  13.  *       source file that it has been changed.  If you're a nice person, you
  14.  *       will clearly mark each change too.  :)
  15.  *     - If you wish to use this for commercial purposes, please contact me at
  16.  *       pullmoll@t-online.de
  17.  *     - The author of this copywritten work reserves the right to change the
  18.  *       terms of its usage and license at any time, including retroactively
  19.  *     - This entire notice must remain in the source code.
  20.  *
  21.  *****************************************************************************/
  22. /* 2.February 2000 PeT added 65sc02 subtype */
  23.  
  24. #ifndef _M6502_H
  25. #define _M6502_H
  26.  
  27. #include "cpuintrf.h"
  28. #include "osd_cpu.h"
  29.  
  30. /* set to 1 to test cur_mrhard/cur_wmhard to avoid calls */
  31. #define FAST_MEMORY 0
  32.  
  33. #define SUBTYPE_6502    0
  34. #if (HAS_M65C02)
  35. #define SUBTYPE_65C02    1
  36. #endif
  37. #if (HAS_M6510)
  38. #define SUBTYPE_6510    2
  39. #endif
  40. #if (HAS_N2A03)
  41. #define SUBTYPE_2A03    3
  42. #endif
  43. #if (HAS_M65SC02)
  44. #define SUBTYPE_65SC02    4
  45. #endif
  46.  
  47. enum {
  48.     M6502_PC=1, M6502_S, M6502_P, M6502_A, M6502_X, M6502_Y,
  49.     M6502_EA, M6502_ZP, M6502_NMI_STATE, M6502_IRQ_STATE, M6502_SO_STATE,
  50.     M6502_SUBTYPE
  51. };
  52.  
  53. #define M6502_INT_NONE    0
  54. #define M6502_INT_IRQ    1
  55. #define M6502_INT_NMI    2
  56. /* use cpu_set_irq_line(cpu, M6502_SET_OVERFLOW, level)
  57.    to change level of the so input line
  58.    positiv edge sets overflow flag */
  59. #define M6502_SET_OVERFLOW 3
  60.  
  61. #define M6502_NMI_VEC    0xfffa
  62. #define M6502_RST_VEC    0xfffc
  63. #define M6502_IRQ_VEC    0xfffe
  64.  
  65. extern int m6502_ICount;                /* cycle count */
  66.  
  67. extern void m6502_reset(void *param);
  68. extern void m6502_exit(void);
  69. extern int    m6502_execute(int cycles);
  70. extern unsigned m6502_get_context(void *dst);
  71. extern void m6502_set_context(void *src);
  72. extern unsigned m6502_get_pc(void);
  73. extern void m6502_set_pc(unsigned val);
  74. extern unsigned m6502_get_sp(void);
  75. extern void m6502_set_sp(unsigned val);
  76. extern unsigned m6502_get_reg(int regnum);
  77. extern void m6502_set_reg(int regnum, unsigned val);
  78. extern void m6502_set_nmi_line(int state);
  79. extern void m6502_set_irq_line(int irqline, int state);
  80. extern void m6502_set_irq_callback(int (*callback)(int irqline));
  81. extern void m6502_state_save(void *file);
  82. extern void m6502_state_load(void *file);
  83. extern const char *m6502_info(void *context, int regnum);
  84. extern unsigned m6502_dasm(char *buffer, unsigned pc);
  85.  
  86. /****************************************************************************
  87.  * The 65C02
  88.  ****************************************************************************/
  89. #if (HAS_M65C02)
  90. #define M65C02_A                        M6502_A
  91. #define M65C02_X                        M6502_X
  92. #define M65C02_Y                        M6502_Y
  93. #define M65C02_S                        M6502_S
  94. #define M65C02_PC                        M6502_PC
  95. #define M65C02_P                        M6502_P
  96. #define M65C02_EA                        M6502_EA
  97. #define M65C02_ZP                        M6502_ZP
  98. #define M65C02_NMI_STATE                M6502_NMI_STATE
  99. #define M65C02_IRQ_STATE                M6502_IRQ_STATE
  100.  
  101. #define M65C02_INT_NONE                 M6502_INT_NONE
  102. #define M65C02_INT_IRQ                    M6502_INT_IRQ
  103. #define M65C02_INT_NMI                    M6502_INT_NMI
  104.  
  105. #define M65C02_NMI_VEC                    M6502_NMI_VEC
  106. #define M65C02_RST_VEC                    M6502_RST_VEC
  107. #define M65C02_IRQ_VEC                    M6502_IRQ_VEC
  108.  
  109. #define m65c02_ICount                    m6502_ICount
  110.  
  111. extern void m65c02_reset(void *param);
  112. extern void m65c02_exit(void);
  113. extern int    m65c02_execute(int cycles);
  114. extern unsigned m65c02_get_context(void *dst);
  115. extern void m65c02_set_context(void *src);
  116. extern unsigned m65c02_get_pc(void);
  117. extern void m65c02_set_pc(unsigned val);
  118. extern unsigned m65c02_get_sp(void);
  119. extern void m65c02_set_sp(unsigned val);
  120. extern unsigned m65c02_get_reg(int regnum);
  121. extern void m65c02_set_reg(int regnum, unsigned val);
  122. extern void m65c02_set_nmi_line(int state);
  123. extern void m65c02_set_irq_line(int irqline, int state);
  124. extern void m65c02_set_irq_callback(int (*callback)(int irqline));
  125. extern void m65c02_state_save(void *file);
  126. extern void m65c02_state_load(void *file);
  127. extern const char *m65c02_info(void *context, int regnum);
  128. extern unsigned m65c02_dasm(char *buffer, unsigned pc);
  129. #endif
  130.  
  131. /****************************************************************************
  132.  * The 65SC02
  133.  ****************************************************************************/
  134. #if (HAS_M65SC02)
  135. #define M65SC02_A                        M6502_A
  136. #define M65SC02_X                        M6502_X
  137. #define M65SC02_Y                        M6502_Y
  138. #define M65SC02_S                        M6502_S
  139. #define M65SC02_PC                        M6502_PC
  140. #define M65SC02_P                        M6502_P
  141. #define M65SC02_EA                        M6502_EA
  142. #define M65SC02_ZP                        M6502_ZP
  143. #define M65SC02_NMI_STATE                M6502_NMI_STATE
  144. #define M65SC02_IRQ_STATE                M6502_IRQ_STATE
  145.  
  146. #define M65SC02_INT_NONE                M6502_INT_NONE
  147. #define M65SC02_INT_IRQ                 M6502_INT_IRQ
  148. #define M65SC02_INT_NMI                 M6502_INT_NMI
  149.  
  150. #define M65SC02_NMI_VEC                 M6502_NMI_VEC
  151. #define M65SC02_RST_VEC                 M6502_RST_VEC
  152. #define M65SC02_IRQ_VEC                 M6502_IRQ_VEC
  153.  
  154. #define m65sc02_ICount                    m6502_ICount
  155.  
  156. extern void m65sc02_reset(void *param);
  157. extern void m65sc02_exit(void);
  158. extern int    m65sc02_execute(int cycles);
  159. extern unsigned m65sc02_get_context(void *dst);
  160. extern void m65sc02_set_context(void *src);
  161. extern unsigned m65sc02_get_pc(void);
  162. extern void m65sc02_set_pc(unsigned val);
  163. extern unsigned m65sc02_get_sp(void);
  164. extern void m65sc02_set_sp(unsigned val);
  165. extern unsigned m65sc02_get_reg(int regnum);
  166. extern void m65sc02_set_reg(int regnum, unsigned val);
  167. extern void m65sc02_set_nmi_line(int state);
  168. extern void m65sc02_set_irq_line(int irqline, int state);
  169. extern void m65sc02_set_irq_callback(int (*callback)(int irqline));
  170. extern void m65sc02_state_save(void *file);
  171. extern void m65sc02_state_load(void *file);
  172. extern const char *m65sc02_info(void *context, int regnum);
  173. extern unsigned m65sc02_dasm(char *buffer, unsigned pc);
  174. #endif
  175.  
  176. /****************************************************************************
  177.  * The 6510
  178.  ****************************************************************************/
  179. #if (HAS_M6510)
  180. #define M6510_A                         M6502_A
  181. #define M6510_X                         M6502_X
  182. #define M6510_Y                         M6502_Y
  183. #define M6510_S                         M6502_S
  184. #define M6510_PC                        M6502_PC
  185. #define M6510_P                         M6502_P
  186. #define M6510_EA                        M6502_EA
  187. #define M6510_ZP                        M6502_ZP
  188. #define M6510_NMI_STATE                 M6502_NMI_STATE
  189. #define M6510_IRQ_STATE                 M6502_IRQ_STATE
  190.  
  191. #define M6510_INT_NONE                    M6502_INT_NONE
  192. #define M6510_INT_IRQ                    M6502_INT_IRQ
  193. #define M6510_INT_NMI                    M6502_INT_NMI
  194.  
  195. #define M6510_NMI_VEC                    M6502_NMI_VEC
  196. #define M6510_RST_VEC                    M6502_RST_VEC
  197. #define M6510_IRQ_VEC                    M6502_IRQ_VEC
  198.  
  199. #define m6510_ICount                    m6502_ICount
  200.  
  201. extern void m6510_reset(void *param);
  202. extern void m6510_exit(void);
  203. extern int    m6510_execute(int cycles);
  204. extern unsigned m6510_get_context(void *dst);
  205. extern void m6510_set_context(void *src);
  206. extern unsigned m6510_get_pc(void);
  207. extern void m6510_set_pc(unsigned val);
  208. extern unsigned m6510_get_sp(void);
  209. extern void m6510_set_sp(unsigned val);
  210. extern unsigned m6510_get_reg(int regnum);
  211. extern void m6510_set_reg(int regnum, unsigned val);
  212. extern void m6510_set_nmi_line(int state);
  213. extern void m6510_set_irq_line(int irqline, int state);
  214. extern void m6510_set_irq_callback(int (*callback)(int irqline));
  215. extern void m6510_state_save(void *file);
  216. extern void m6510_state_load(void *file);
  217. extern const char *m6510_info(void *context, int regnum);
  218. extern unsigned m6510_dasm(char *buffer, unsigned pc);
  219.  
  220. #ifdef MAME_DEBUG
  221. extern unsigned int Dasm6510( char *dst, unsigned pc );
  222. #endif
  223.  
  224. #endif
  225.  
  226. #ifdef HAS_M6510T
  227. #define M6510T_A                        M6502_A
  228. #define M6510T_X                        M6502_X
  229. #define M6510T_Y                        M6502_Y
  230. #define M6510T_S                        M6502_S
  231. #define M6510T_PC                        M6502_PC
  232. #define M6510T_P                        M6502_P
  233. #define M6510T_EA                        M6502_EA
  234. #define M6510T_ZP                        M6502_ZP
  235. #define M6510T_NMI_STATE                M6502_NMI_STATE
  236. #define M6510T_IRQ_STATE                M6502_IRQ_STATE
  237.  
  238. #define M6510T_INT_NONE                 M6502_INT_NONE
  239. #define M6510T_INT_IRQ                    M6502_INT_IRQ
  240. #define M6510T_INT_NMI                    M6502_INT_NMI
  241.  
  242. #define M6510T_NMI_VEC                    M6502_NMI_VEC
  243. #define M6510T_RST_VEC                    M6502_RST_VEC
  244. #define M6510T_IRQ_VEC                    M6502_IRQ_VEC
  245.  
  246. #define m6510t_ICount                   m6502_ICount
  247.  
  248. #define m6510t_reset m6510_reset
  249. #define m6510t_exit m6510_exit
  250. #define m6510t_execute m6510_execute
  251. #define m6510t_get_context m6510_get_context
  252. #define m6510t_set_context m6510_set_context
  253. #define m6510t_get_pc m6510_get_pc
  254. #define m6510t_set_pc m6510_set_pc
  255. #define m6510t_get_sp m6510_get_sp
  256. #define m6510t_set_sp m6510_set_sp
  257. #define m6510t_get_reg m6510_get_reg
  258. #define m6510t_set_reg m6510_set_reg
  259. #define m6510t_set_nmi_line m6510_set_nmi_line
  260. #define m6510t_set_irq_line m6510_set_irq_line
  261. #define m6510t_set_irq_callback m6510_set_irq_callback
  262. #define m6510t_state_save m6510_state_save
  263. #define m6510t_state_load m6510_state_load
  264. extern const char *m6510t_info(void *context, int regnum);
  265. #define m6510t_dasm m6510_dasm
  266. #endif
  267.  
  268. #ifdef HAS_M7501
  269. #define M7501_A                         M6502_A
  270. #define M7501_X                         M6502_X
  271. #define M7501_Y                         M6502_Y
  272. #define M7501_S                         M6502_S
  273. #define M7501_PC                        M6502_PC
  274. #define M7501_P                         M6502_P
  275. #define M7501_EA                        M6502_EA
  276. #define M7501_ZP                        M6502_ZP
  277. #define M7501_NMI_STATE                 M6502_NMI_STATE
  278. #define M7501_IRQ_STATE                 M6502_IRQ_STATE
  279.  
  280. #define M7501_INT_NONE                    M6502_INT_NONE
  281. #define M7501_INT_IRQ                    M6502_INT_IRQ
  282. #define M7501_INT_NMI                    M6502_INT_NMI
  283.  
  284. #define M7501_NMI_VEC                    M6502_NMI_VEC
  285. #define M7501_RST_VEC                    M6502_RST_VEC
  286. #define M7501_IRQ_VEC                    M6502_IRQ_VEC
  287.  
  288. #define m7501_ICount                    m6502_ICount
  289.  
  290. #define m7501_reset m6510_reset
  291. #define m7501_exit m6510_exit
  292. #define m7501_execute m6510_execute
  293. #define m7501_get_context m6510_get_context
  294. #define m7501_set_context m6510_set_context
  295. #define m7501_get_pc m6510_get_pc
  296. #define m7501_set_pc m6510_set_pc
  297. #define m7501_get_sp m6510_get_sp
  298. #define m7501_set_sp m6510_set_sp
  299. #define m7501_get_reg m6510_get_reg
  300. #define m7501_set_reg m6510_set_reg
  301. #define m7501_set_nmi_line m6510_set_nmi_line
  302. #define m7501_set_irq_line m6510_set_irq_line
  303. #define m7501_set_irq_callback m6510_set_irq_callback
  304. #define m7501_state_save m6510_state_save
  305. #define m7501_state_load m6510_state_load
  306. extern const char *m7501_info(void *context, int regnum);
  307. #define m7501_dasm m6510_dasm
  308. #endif
  309.  
  310. #ifdef HAS_M8502
  311. #define M8502_A                         M6502_A
  312. #define M8502_X                         M6502_X
  313. #define M8502_Y                         M6502_Y
  314. #define M8502_S                         M6502_S
  315. #define M8502_PC                        M6502_PC
  316. #define M8502_P                         M6502_P
  317. #define M8502_EA                        M6502_EA
  318. #define M8502_ZP                        M6502_ZP
  319. #define M8502_NMI_STATE                 M6502_NMI_STATE
  320. #define M8502_IRQ_STATE                 M6502_IRQ_STATE
  321.  
  322. #define M8502_INT_NONE                    M6502_INT_NONE
  323. #define M8502_INT_IRQ                    M6502_INT_IRQ
  324. #define M8502_INT_NMI                    M6502_INT_NMI
  325.  
  326. #define M8502_NMI_VEC                    M6502_NMI_VEC
  327. #define M8502_RST_VEC                    M6502_RST_VEC
  328. #define M8502_IRQ_VEC                    M6502_IRQ_VEC
  329.  
  330. #define m8502_ICount                    m6502_ICount
  331.  
  332. #define m8502_reset m6510_reset
  333. #define m8502_exit m6510_exit
  334. #define m8502_execute m6510_execute
  335. #define m8502_get_context m6510_get_context
  336. #define m8502_set_context m6510_set_context
  337. #define m8502_get_pc m6510_get_pc
  338. #define m8502_set_pc m6510_set_pc
  339. #define m8502_get_sp m6510_get_sp
  340. #define m8502_set_sp m6510_set_sp
  341. #define m8502_get_reg m6510_get_reg
  342. #define m8502_set_reg m6510_set_reg
  343. #define m8502_set_nmi_line m6510_set_nmi_line
  344. #define m8502_set_irq_line m6510_set_irq_line
  345. #define m8502_set_irq_callback m6510_set_irq_callback
  346. #define m8502_state_save m6510_state_save
  347. #define m8502_state_load m6510_state_load
  348. extern const char *m8502_info(void *context, int regnum);
  349. #define m8502_dasm m6510_dasm
  350. #endif
  351.  
  352.  
  353. /****************************************************************************
  354.  * The 2A03 (NES 6502 without decimal mode ADC/SBC)
  355.  ****************************************************************************/
  356. #if (HAS_N2A03)
  357. #define N2A03_A                         M6502_A
  358. #define N2A03_X                         M6502_X
  359. #define N2A03_Y                         M6502_Y
  360. #define N2A03_S                         M6502_S
  361. #define N2A03_PC                        M6502_PC
  362. #define N2A03_P                         M6502_P
  363. #define N2A03_EA                        M6502_EA
  364. #define N2A03_ZP                        M6502_ZP
  365. #define N2A03_NMI_STATE                 M6502_NMI_STATE
  366. #define N2A03_IRQ_STATE                 M6502_IRQ_STATE
  367.  
  368. #define N2A03_INT_NONE                    M6502_INT_NONE
  369. #define N2A03_INT_IRQ                    M6502_INT_IRQ
  370. #define N2A03_INT_NMI                    M6502_INT_NMI
  371.  
  372. #define N2A03_NMI_VEC                    M6502_NMI_VEC
  373. #define N2A03_RST_VEC                    M6502_RST_VEC
  374. #define N2A03_IRQ_VEC                    M6502_IRQ_VEC
  375.  
  376. #define n2a03_ICount                    m6502_ICount
  377.  
  378. extern void n2a03_reset(void *param);
  379. extern void n2a03_exit(void);
  380. extern int    n2a03_execute(int cycles);
  381. extern unsigned n2a03_get_context(void *dst);
  382. extern void n2a03_set_context(void *src);
  383. extern unsigned n2a03_get_pc(void);
  384. extern void n2a03_set_pc(unsigned val);
  385. extern unsigned n2a03_get_sp(void);
  386. extern void n2a03_set_sp(unsigned val);
  387. extern unsigned n2a03_get_reg(int regnum);
  388. extern void n2a03_set_reg (int regnum, unsigned val);
  389. extern void n2a03_set_nmi_line(int state);
  390. extern void n2a03_set_irq_line(int irqline, int state);
  391. extern void n2a03_set_irq_callback(int (*callback)(int irqline));
  392. extern void n2a03_state_save(void *file);
  393. extern void n2a03_state_load(void *file);
  394. extern const char *n2a03_info(void *context, int regnum);
  395. extern unsigned n2a03_dasm(char *buffer, unsigned pc);
  396.  
  397.  
  398. #define N2A03_DEFAULTCLOCK (21477272.724 / 12)
  399.  
  400. /* The N2A03 is integrally tied to its PSG (they're on the same die).
  401.    Bit 7 of address $4011 (the PSG's DPCM control register), when set,
  402.    causes an IRQ to be generated.  This function allows the IRQ to be called
  403.    from the PSG core when such an occasion arises. */
  404. extern void n2a03_irq(void);
  405. #endif
  406.  
  407. #ifdef MAME_DEBUG
  408. extern unsigned Dasm6502( char *dst, unsigned pc );
  409. #endif
  410.  
  411. #endif /* _M6502_H */
  412.  
  413.